#ifndef VISTA_LIBRE_H_
#define VISTA_LIBRE_H_

#include "vista.h"
#include "camfija.h"
#include "handler.h"
#include "vehiculo.h"


class VistaLibre : public Vista {
   private:
      CamFija camLibre;
      Vehiculo &vehiculo;

      void moveCamFija( int x, int y, int deltaX, int deltaY) {
         if ((deltaX<40)&&(deltaY<40)){
            camLibre.giro( camLibre.giro() + (deltaX) / 3.0 );

            camLibre.elevacion( camLibre.elevacion() + (deltaY) / 3.0 );

            if(camLibre.elevacion() <= -60) camLibre.elevacion(-60);
            if(camLibre.elevacion() >= 60) camLibre.elevacion(60);
         }
      }

      void desplazarCamFija(unsigned char key, int x, int y) {
         switch(key) {
            case GLUT_KEY_LEFT:
               camLibre.izquierda(1);
               break;
            case GLUT_KEY_RIGHT:
               camLibre.derecha(1);
               break;
            case GLUT_KEY_UP:
               camLibre.avanzar(1);
               break;
            case GLUT_KEY_DOWN:
               camLibre.retroceder(1);
               break;
         }
      }

      void altura_mouse(int boton,int estado,int x, int y){
         enum {
            MOUSE_SCROLL_UP = 3,
            MOUSE_SCROLL_DOWN = 4
         };

         if (boton==MOUSE_SCROLL_UP)
            camLibre.z() -= camLibre.z() <= -10 ? 0 : 0.5;
         if (boton==MOUSE_SCROLL_DOWN)
            camLibre.z() += camLibre.z() >= 0 ? 0 : 0.5;
      }
   public:
      VistaLibre(Handler& handler, Vehiculo &vehiculo) :
         camLibre(), vehiculo(vehiculo) {

            Acciones::agregar(handler.signal_move().connect(sigc::mem_fun(*this, &VistaLibre::moveCamFija)));
            Acciones::agregar(handler.signal_specialkeyDown().connect(sigc::mem_fun(*this, &VistaLibre::desplazarCamFija)));
            Acciones::agregar(handler.signal_mouse().connect(sigc::mem_fun(*this, &VistaLibre::altura_mouse)));
            
            camLibre.izquierda(4);
            camLibre.avanzar(4);
         }

      void ver() const {
         camLibre.ver();
      }
};

#endif
